package cn.fsd.util;

import cn.fsd.vo.ClassTreeNode;
import cn.fsd.vo.ClassTreeRoot;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @Description: 生成树结构的工具类（DCL单例）
 */
public class TreeUtil {

  private volatile static TreeUtil INSTANCE;

  // 构造方法私有化
  private TreeUtil() {

  }

  // 获取树工具单例 （DCL单例）
  public static TreeUtil getInstance() {
    if (INSTANCE == null) {
      synchronized (TreeUtil.class) {
        if (INSTANCE == null) {
          INSTANCE = new TreeUtil();
        }
      }
    }
    return INSTANCE;
  }

  public List<ClassTreeNode> enquireTree(List<ClassTreeRoot> treeItemList) {

    if (treeItemList.isEmpty()) {
      return null;
    }

    // 过滤空对象
    List<ClassTreeRoot> treeItems = treeItemList.stream().filter(Objects::nonNull).collect(
        Collectors.toList());

    // 存储 id treeItem
    HashMap<String, ClassTreeRoot> itemMap = new HashMap<>();
    treeItems.forEach(treeItem -> {
      itemMap.put(treeItem.getClassId(), treeItem);
    });

    // 声明一个变量存放根节点
    List<ClassTreeNode> roots = new ArrayList<>();

//    数据组装,遍历hashmap中的item进行拼装
    itemMap.forEach((key, value) -> {
      String pid = value.getParentId();
      if (Objects.equals(value.getLevel(), Constants.PARENT)) {
        roots.add(value);
      } else {
        ClassTreeRoot parent = itemMap.get(pid);
        parent.getChildren().add(new ClassTreeNode(value));
      }
    });

    //将没有子节点的父级节点去掉
    List<ClassTreeNode> res = roots.stream().filter(item->{
      ClassTreeRoot r = (ClassTreeRoot) item;
      return r.getChildren().size()!=0;
    }).collect(Collectors.toList());

    return res;
  }

}

